#include<cstdio>//uncle-lu
#include<cstring>
#include<vector>
#include<algorithm>
template<class T>void read(T &x)
{
	x=0;int f=0;char ch=getchar();
	while(ch<'0'||ch>'9') { f|=(ch=='-'); ch=getchar(); }
	while(ch<='9'&&ch>='0') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
	x = f ? -x : x;
	return ;
}

struct node{
	int v, val;
};
std::vector<node>son[110];
int F[110][110][110], G[110][110][110];
int line[110], sta[110], D[110];
int n, K, top;

void DFS(int x)
{
	sta[++top] = x;
	for (int i = 0; i < (int)son[x].size(); i++) 
	{
		int v = son[x][i].v;
		D[v] = D[x] + son[x][i].val;//树上前缀和
		DFS(v);
		//分配伐木场
		for (int j = 1; j <= top; j++) //枚举祖先
		{
			int fa = sta[j];
			for (int k = K; k >= 0; k--)//x节点旗下建的伐木场的数量
			{
				F[x][fa][k] += F[v][fa][0];
				G[x][fa][k] += F[v][x][0];
				for (int t = 1; t <= k; t++) //t节点旗下建的伐木场的数量 
				{
					F[x][fa][k] = std::min(F[x][fa][k], F[x][fa][k-t] + F[v][fa][t]);
					G[x][fa][k] = std::min(G[x][fa][k], G[x][fa][k-t] + F[v][x][t]);
				}
			}
		}
	}

	//计算x到上一个伐木场的费用
	for (int j = 1; j <= top; j++) 
	{
		int fa = sta[j];
		for (int k = 0; k <= K; k++) 
		{
			if(k >= 1)
				F[x][fa][k] = std::min(F[x][fa][k] + line[x] * (D[x] - D[fa]), G[x][fa][k-1]);
			else
				F[x][fa][k] += line[x]*(D[x] - D[fa]);
		}
	}
	top--;
	return ;
}

int main()
{
	read(n);read(K);
	int x, val;
	for (int i = 1; i <= n; i++) 
	{
		read(line[i]);read(x);read(val);
		son[x].push_back((node){i, val});
	}

	DFS(0);

	printf("%d", F[0][0][K]);

	return 0;
}
